package eu.europeana.cloud.service.mcs.rest; import com.google.common.collect.ImmutableMap; import com.google.common.hash.Hashing; import eu.europeana.cloud.common.model.DataProvider; import eu.europeana.cloud.common.model.File; import eu.europeana.cloud.common.model.Representation; import eu.europeana.cloud.common.web.ParamConstants; import eu.europeana.cloud.service.mcs.ApplicationContextUtils; import eu.europeana.cloud.service.mcs.UISClientHandler; import eu.europeana.cloud.test.CassandraTestInstance; import eu.europeana.cloud.test.CassandraTestRunner; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.apache.commons.io.input.NullInputStream; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.test.JerseyTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.context.ApplicationContext; import javax.ws.rs.Path; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.ByteArrayInputStream; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(CassandraTestRunner.class) public class FileUploadResourceTest extends JerseyTest { private WebTarget fileWebTarget; private File file; @Override public Application configure() { return new JerseyConfig().property("contextConfigLocation", "classpath:spiedPersistentServicesTestContext.xml"); } @Override protected void configureClient(ClientConfig config) { config.register(MultiPartFeature.class); } @Before public void init(){ CassandraTestInstance.truncateAllData(false); ApplicationContext applicationContext = ApplicationContextUtils.getApplicationContext(); UISClientHandler uisHandler = applicationContext.getBean(UISClientHandler.class); Mockito.doReturn(new DataProvider()).when(uisHandler).getProvider(Mockito.anyString()); Mockito.doReturn(true).when(uisHandler).existsCloudId(Mockito.anyString()); Representation rep = new Representation(); rep.setCloudId("cloudId"); rep.setRepresentationName("representationName"); rep.setVersion("versionId"); file = new File(); file.setFileName("fileName"); file.setMimeType("application/octet-stream"); Map<String, Object> allPathParams = ImmutableMap.<String, Object>of(ParamConstants.P_CLOUDID, rep.getCloudId(), ParamConstants.P_REPRESENTATIONNAME, rep.getRepresentationName(), ParamConstants.P_VER, rep.getVersion()); fileWebTarget = target(FileUploadResource.class.getAnnotation(Path.class).value()).resolveTemplates(allPathParams); } @Test public void shouldUploadFileForNonExistingRepresentation() { //given String providerId = "providerId"; byte[] content = new byte[1000]; ThreadLocalRandom.current().nextBytes(content); String contentMd5 = Hashing.md5().hashBytes(content).toString(); FormDataMultiPart multipart = new FormDataMultiPart() .field(ParamConstants.F_PROVIDER,providerId) .field(ParamConstants.F_FILE_MIME, file.getMimeType()) .field(ParamConstants.F_FILE_DATA, new ByteArrayInputStream(content), MediaType.APPLICATION_OCTET_STREAM_TYPE).field(ParamConstants.F_FILE_NAME, file.getFileName()); //when Response uploadFileResponse = fileWebTarget.request().post(Entity.entity(multipart, multipart.getMediaType())); //then assertThat("Unexpected status code",uploadFileResponse.getStatus(),is(201)); assertThat("File content tag does not match",uploadFileResponse.getEntityTag().getValue(),is(contentMd5)); } }